﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;


namespace Librerias
{
    /// <summary>
    /// Clase Entidad de Negocio Noticias
    /// </summary>
    public class ENNoticias : ENBase
    {
        #region variables
        /// <summary>
        /// Identificador de la Noticia 
        /// (será un campo automático y autonumerado en la BD)
        /// </summary>
        private int id;
        /// <summary>
        /// Fecha de creación de la Noticia. 
        /// No podrá ser NULO.
        /// </summary>
        private DateTime fechaCreacion;
        /// <summary>
        /// Emisor (Profesor o Alumno) de la Noticia. 
        /// No podrá ser NULO.
        /// </summary>
        private string emisor;
        /// <summary>
        /// Receptor (asignatura) de la Noticia. 
        /// No podrá ser NULO.
        /// </summary>
        private string receptor;
        /// <summary>
        /// Asunto, sobre lo que versará la Noticia.
        /// No podrá ser NULO.
        /// </summary>
        private string asunto;
        /// <summary>
        /// Mensaje, desarrollo de la Noticia en sí.
        /// No podrá ser NULO. 
        /// </summary>
        private string mensaje;
        /// <summary>
        /// Archivo adjunto, no es obligatorio. 
        /// No podrá ser NULO.
        /// </summary>
        private string archivo;
        /// <summary>
        /// Visibilidad de la noticia: 0 privada 1 pública. 
        /// No podrá ser NULO.
        /// Por defecto será 1 (pública), por lo que, se publicará en la Web
        /// </summary>
        private int visibilidad;

        #endregion

        #region get set

        /// <summary>
        /// Identificación de la noticia
        /// </summary>
        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        /// <summary>
        /// Fecha de creación de la noticia
        /// </summary>
        public DateTime FechaCreacion
        {
            get { return fechaCreacion; }
            set { fechaCreacion = value; }
        }

        /// <summary>
        /// El que publica la noticia
        /// </summary>
        public string Emisor
        {
            get { return emisor; }
            set { emisor = value; }
        }

        /// <summary>
        /// Al que irá destinada la noticia
        /// </summary>
        public string Receptor
        {
            get { return receptor; }
            set { receptor = value; }
        }

        /// <summary>
        /// Sobre lo que versa la noticia
        /// </summary>
        public string Asunto
        {
            get { return asunto; }
            set { asunto = value; }
        }

        /// <summary>
        /// Noticia en sí
        /// </summary>
        public string Mensaje
        {
            get { return mensaje; }
            set { mensaje = value; }
        }

        /// <summary>
        /// Si lleva archivo adjunto, aqui guardaremos su referencia
        /// </summary>
        public string Archivo
        {
            get { return archivo; }
            set { archivo = value; }
        }

        /// <summary>
        /// Si 0 será privada, si 1 será pública 
        /// </summary>
        public int Visibilidad
        {
            get { return visibilidad; }
            set { visibilidad = value; }
        }


        #endregion

        #region constructores

        /// <summary>
        /// Constructor vacío
        /// </summary>
        public ENNoticias()
        {
            fechaCreacion = DateTime.Now;
            emisor = string.Empty;
            receptor = string.Empty;
            asunto = string.Empty;
            mensaje = string.Empty;
            archivo = string.Empty;
            //en ppio una noticia será privada
            visibilidad = 0;
        }

      /// <summary>
      /// Const Parametrizado
      /// </summary>
      /// <param name="unemisor">emisor</param>
      /// <param name="unreceptor">receptor</param>
      /// <param name="unasunto">asunto</param>
      /// <param name="unmensaje">mensaje</param>
      /// <param name="unarchivo">archivo</param>
      /// <param name="unavisibilidad">visibilidad</param>
        public ENNoticias(string unemisor, string unreceptor, string unasunto, string unmensaje, string unarchivo, int unavisibilidad)
        {
            fechaCreacion = DateTime.Now;
            emisor = unemisor;
            receptor = unreceptor;
            asunto = unasunto;
            mensaje = unmensaje;
            archivo = unarchivo;
            visibilidad = unavisibilidad;
        }

        /// <summary>
        /// Constructor parametrizado
        /// </summary>
        /// <param name="ident">id</param>
        /// <param name="fecha">fecha</param>
        /// <param name="unemisor">emisor</param>
        /// <param name="unreceptor">receptor</param>
        /// <param name="unasunto">asunto</param>
        /// <param name="unmensaje">mensaje</param>
        /// <param name="unarchivo">archivo</param>
        /// <param name="unavisibilidad">visibilidad</param>
        public ENNoticias(int ident, DateTime fecha, string unemisor, string unreceptor, string unasunto, string unmensaje, string unarchivo, int unavisibilidad)
        {
            id = ident;
            fechaCreacion = fecha;
            emisor = unemisor;
            receptor = unreceptor;
            asunto = unasunto;
            mensaje = unmensaje;
            archivo = unarchivo;
            visibilidad = unavisibilidad;
        }

        #endregion

        #region interfaz
        #region nuevaNoticia
        /// <summary>
        /// Lo usaremos para publicar una nueva Noticia
        /// </summary>
        /// <param name="unEmisor">Profesor o Alumno que la publica</param>
        /// <param name="unReceptor">Asignatura a la que se refiere</param>
        /// <param name="unAsunto">Sobre lo que versa</param>
        /// <param name="unMensaje">Noticia en sí</param>
        /// <param name="unArchivo">Archivo si lo tuviera</param>
        /// <param name="unaVisibilidad">Si queremos que se vea en la Web Pública, sino privada</param>
        public void nuevaNoticia(string unEmisor, string unReceptor, string unAsunto, string unMensaje, string unArchivo, int unaVisibilidad, ProgressBar barra )
        {
            ENNoticias laNuevaNoticia = new ENNoticias(unEmisor, unReceptor, unAsunto, unMensaje, unArchivo, unaVisibilidad);
            CADNoticia criadoCAD = new CADNoticia();
            criadoCAD.NuevaNoticia(laNuevaNoticia, barra);
        }

        public void nuevaNoticia(string unEmisor, string unReceptor, string unAsunto, string unMensaje, string unArchivo, int unaVisibilidad)
        {
            ENNoticias laNuevaNoticia = new ENNoticias(unEmisor, unReceptor, unAsunto, unMensaje, unArchivo, unaVisibilidad);
            CADNoticia criadoCAD = new CADNoticia();
            criadoCAD.NuevaNoticia(laNuevaNoticia, null);
        }
        #endregion

        #region listaNoticias
        /// <summary>
        /// Nos devolverá un listado con todas las noticias sin ningún tipo de filtro
        /// </summary>
        /// <returns>Lista con todas las Noticias</returns>
        public List<ENNoticias> listaNoticias()
        {
            List<ENNoticias> salida = new List<ENNoticias>();

            CADNoticia criadoCAD = new CADNoticia();
            salida = criadoCAD.listaNoticias();

            return salida;
        }
        #endregion

        /// <summary>
        /// Busca en noticias dada una asignatura un texto por un criterio 
        /// </summary>
        /// <param name="asignatura">asignatura</param>
        /// <param name="texto">texto buscado</param>
        /// <param name="criterio">criterio</param>
        /// <returns>DataTable con los resultados</returns>
        public DataTable Buscar(string asignatura, string texto, int criterio)
        {
            return new CADNoticia().Buscar(asignatura, texto, criterio);
        }

        
        #region dimeTodasNoticias
        /// <summary>
        /// Nos dirá todas las noticias
        /// </summary>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeTodasNoticias()
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeTodasNoticias();

            return salida;
        }
        #endregion

        #region dimeNoticiasSegunFecha
        /// <summary>
        /// Noticias segun una fecha
        /// </summary>
        /// <param name="fechita">fecha</param>
        /// <returns>DataTable con los datos</returns>
        public DataTable dimeNoticiasSegunFecha(DateTime fechita)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeNoticiasSegunFecha(fechita);

            return salida;
        }
        #endregion  

        #region dimeNoticiasSegunProfesor
        /// <summary>
        /// Noticias dado un profesor 
        /// </summary>
        /// <param name="profesorcito">profesor</param>
        /// <returns>DataTable con los datos</returns>
        public DataTable dimeNoticiasSegunProfesor(string profesorcito)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeNoticiasSegunProfesor(profesorcito);

            return salida;        
        }
        #endregion

        #region dimeNoticiasSegunMisAsignaturas
        /// <summary>
        /// Noticias de un profesor y de sus asignaturas
        /// </summary>
        /// <param name="profesorcito">profesor</param>
        /// <returns>DataTable con los datos</returns>
        public DataTable dimeNoticiasSegunMisAsignaturas(string profesorcito)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeNoticiasSegunMisAsignaturas(profesorcito);

            return salida;        
        }
        #endregion

        #region dimeMisAsignaturas
        /// <summary>
        /// A un profesor le dice sus asignaturas
        /// </summary>
        /// <param name="profesorcito">profesor</param>
        /// <returns>DataTable con la info</returns>
        public DataTable dimeMisAsignaturas(string profesorcito)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeMisAsignaturas(profesorcito);

            return salida;    
        }
        #endregion

        #region dimeNoticiasSegunUnaAsignatura
        /// <summary>
        /// Noticias según una asignatura
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con la info</returns>
        public DataTable dimeNoticiasSegunUnaAsignatura(string asignaturita)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeNoticiasSegunUnaAsignatura(asignaturita);

            return salida;    
        }
        #endregion


        #region dimeNoticiasSegunUnaAsignaturaOrderByDataDESC
        /// <summary>
        /// Noticias según una asignatura ordenadas por fecha descendiente
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con la info</returns>
        public DataTable dimeNoticiasSegunUnaAsignaturaOrderByDataDESC(string asignaturita)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeNoticiasSegunUnaAsignaturaOrderByDataDESC(asignaturita);

            return salida;    
        }
        #endregion

        public DataView dimeUnaNoticiaConPuntos(string id)
        {
            CADNoticia criadoCAD = new CADNoticia();
            return criadoCAD.dimeUnaNoticiaConPuntos(id);
        }


        /// <summary>
        /// Descarga desde Dropbox
        /// </summary>
        /// <param name="rutaDrop">ruta dropbox</param>
        /// <param name="rutaPC">ruta pc</param>
        /// <param name="barra">barra progreso</param>
        /// <returns>Si todo bien</returns>
        public bool Descargar(string rutaDrop,string rutaPC, ProgressBar barra = null)
        {
            return new CADNoticia().Descargar(rutaDrop, rutaPC, barra);
        }

        #region BorraNoticia
        /// <summary>
        /// Borra noticia segun id
        /// </summary>
        /// <param name="id">id</param>
        public void borraNoticia(string id)
        {
            new CADNoticia().borraNoticia(id);
        }
        #endregion
        #region listaNoticiasDadaAsignatura
        /// <summary>
        /// Lista de Noticias dada una Asignatura
        /// </summary>
        /// <param name="unaAsignatura">Asignatura de la que necesitamos saber Noticias</param>
        /// <returns>Lista de todas las Noticias de esa asignatura</returns>
        public List<ENNoticias> listaNoticiasDadaAsignatura(string unaAsignatura)
        {
            List<ENNoticias> salida = new List<ENNoticias>();

            CADNoticia criadoCAD = new CADNoticia();
            salida = criadoCAD.listaNoticiasDadaAsignatura(unaAsignatura);

            return salida;
        }
        #endregion
        #region listaNoticiasDadoEmisor
        /// <summary>
        /// Lista de Noticias dado un propietario 
        /// </summary>
        /// <param name="unEmisor">Usuario del que queremos saber sus Noticias publicadas</param>
        /// <returns>Lista con todas las Noticias de este Usuario</returns>      
        public List<ENNoticias> listaNoticiasDadoEmisor(string unEmisor)
        {
            List<ENNoticias> salida = new List<ENNoticias>();

            CADNoticia criadoCAD = new CADNoticia();
            salida = criadoCAD.listaNoticiasDadoEmisor(unEmisor);

            return salida;
        }
        #endregion
        #region actualizaNoticia
        /// <summary>
        /// Actualiza Noticia 
        /// </summary>
        /// <param name="barra">Le pasamos una barra</param>
        public void actualizaNoticia(ProgressBar barra)
        {
            new CADNoticia().actualizaNoticia(this,barra);
        }
        #endregion
        #region esAsignatura
        /// <summary>
        /// Saber si una cadena es una signatura válida
        /// </summary>
        /// <param name="unaAsignatura">asignatura</param>
        /// <returns>Si lo es V</returns>
        public bool EsAsignatura(string unaAsignatura)
        {
            CADNoticia criadoCAD = new CADNoticia();
            return(criadoCAD.EsAsignatura(unaAsignatura));
        }
        #endregion
        #endregion

        #region web
        #region dimeTodasNoticiasWeb
        /// <summary>
        /// Nos dirá todas las noticias adaptadas para la web
        /// </summary>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeTodasNoticiasWeb()
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeTodasNoticiasWeb();

            return salida;
        }
        #endregion
        #region dimeTodasNoticiasPublicasWeb-doc-tirando
        /// <summary>
        /// Nos dirá todas las noticias adaptadas para la web Públicas
        /// </summary>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeTodasNoticiasPublicasWeb()
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeTodasNoticiasPublicasWeb();

            return salida;
        }
        #endregion
        #region dimeTodasNoticiasWebSegunProfesor(string unProfesor)-tirando
        public DataTable dimeTodasNoticiasWebSegunProfesor(string unProfesor)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeTodasNoticiasWebSegunProfesor(unProfesor);

            return salida;
        }
        #endregion

        #region dimeTodasNoticiasWebSegunAlumno(string unAlumno)
        public DataTable dimeTodasNoticiasWebSegunAlumno(string unAlumno)
        {
            DataTable salida = new DataTable();
            CADNoticia criadoCAD = new CADNoticia();

            salida = criadoCAD.dimeTodasNoticiasWebSegunAlumno(unAlumno);

            return salida;
        }
        #endregion

        #region esNoticiaExistente
        /// <summary>
        /// Saber si una noticia existe
        /// </summary>
        /// <param name="unaAsignatura">asignatura</param>
        /// <returns>Si existe V</returns>
        public bool EsNoticiaExistente(int idNoticiaBuscada)
        {
            CADNoticia criadoCAD = new CADNoticia();
            return (criadoCAD.EsNoticiaExistente(idNoticiaBuscada));
        }
        #endregion
        
        /// <summary>
        /// Nos dice todas las noticias de una asignatura
        /// </summary>
        /// <param name="asignatura">Asignatura</param>
        /// <returns></returns>
        public DataTable GetNoticiasSegunAsignaturasWeb(string asignatura)
        {
            CADNoticia criadoCAD = new CADNoticia();
            return (criadoCAD.GetNoticiasSegunAsignaturasWeb(asignatura));
        }
      

         public DataTable dimeNoticiasSegunUnaAsignaturaOrderByDataDESCConPuntos(string asignaturita)
         {
            CADNoticia criadoCAD = new CADNoticia();
            return (criadoCAD.dimeNoticiasSegunUnaAsignaturaOrderByDataDESCConPuntos(asignaturita));
        }
       
        public DataTable dimeTodasNoticiasOrderByDataDESCConPuntos()
         {
             CADNoticia criadoCAD = new CADNoticia();
             return (criadoCAD.dimeTodasNoticiasOrderByDataDESCConPuntos());
         }



        public bool esNoticiaVotada(string votante, int idNoticia)
        {
            CADNoticia androide = new CADNoticia();
            return (androide.esNoticiaVotada(votante, idNoticia));
        }

        public DataTable dimeLaUltimaNoticia(string autor)
        {
            CADNoticia androide = new CADNoticia();
            return (androide.dimeLaUltimaNoticia(autor));
        }

        public void NuevaNoticiaWeb(ENNoticias eNNoticia)
        {
            CADNoticia androide = new CADNoticia();
            androide.NuevaNoticiaWeb(eNNoticia);
        }

        public int numeroNoticiasPorUsuario(string votante)
        {
            CADNoticia androide = new CADNoticia();
            return(androide.numeroNoticiasPorUsuario(votante));
        }

        public int numeroVotosPorUsuario(string votante)
        {
            CADNoticia androide = new CADNoticia();
            return (androide.numeroVotosPorUsuario(votante));
        }

        public int numeroComentariosPorUsuario(string comentarista)
        {
            CADNoticia androide = new CADNoticia();
            return (androide.numeroComentariosPorUsuario(comentarista));
        }
        #endregion
    }
}
